from pathlib import Path
import random
import time

from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By

from .browser import Browser
from . import database as db


class Parser(Browser):

    """ Этот класс представляет парсер """

    def __init__(self, data, proxy_list=None):

        self.input_arguments = {
            'display_browser': data[0],
            'keyword': data[1],
        }

        self.link = 'https://www.fl.ru/projects/'
        self.proxy_list = proxy_list


    def wait(self, f=2, b=3.5):

        """ Чуть-чуть подождать """

        number = random.uniform(f, b)
        time.sleep(number)


    def convert_to_bs(self, browser):

        """ Получаем объект BeautifulSoup """

        html_source = browser.page_source
        page = BeautifulSoup(html_source, 'lxml')

        return page


    def get_saved_page(self, file_name):

        """ Открываем сохраненную страницу для парсинга и возвращаем ее """

        folder = Path('saved_html/')
        page = folder/file_name

        with open(page, 'r', encoding='utf-8') as file:

            text = file.read()
            page = BeautifulSoup(text, 'lxml')

            return page


    def get_configured_browser(self, proxy=None):

        """ Получаем настроенный браузер """

        if not proxy: return self.get_browser(self.input_arguments['display_browser'])

        for proxy in self.proxy_list:

            browser = self.get_browser(self.input_arguments['display_browser'], proxy)

            return browser


    def enter_text_in_field(self, browser, xpath_element, text):

        """ Вводим переданный текст в переданное переданное """

        xpath_element.click()
        xpath_element.clear()
        xpath_element.send_keys(text)

        self.wait(.5, .8)


    def click_on_button(self, browser, xpath_element):

        """ Нажимаем на кнопку """

        xpath_element.click()
        self.wait(.5, .8)


    def specify_filters(self, browser):

        """ Указываем фильтры """

        def select_orders_to_all(browser):

            """ Выбираем заказы для всех """

            pass


        def enter_keyword(browser):

            """ Вводим ключевое слово """

            input_field_xpath = browser.find_element(
                By.XPATH,
                '//input[@name="pf_keywords"]'
            )

            self.enter_text_in_field(browser, input_field_xpath, self.input_arguments['keyword'])


        def get_apply_filter_button(browser):

            """ Получаем кнопку применить фильтры для нажатия по ней """

            apply_filter_button = browser.find_element(
                By.XPATH,
                '//button[text()[contains(.,"Применить фильтр")]]'
            )

            return apply_filter_button


        # ВЫШЕ ОПРЕДЕЛЕНИЕ ФУНКЦИЙ

        select_orders_to_all(browser)
        enter_keyword(browser)                                    # Указываем ключевое слово
        apply_filter_button = get_apply_filter_button(browser)    # Получаем кнопку

        self.click_on_button(browser, apply_filter_button)


    def get_links_to_orders(self, browser):

        """ Получаем ссылки на заказы """

        links_to_orders_selenium = browser.find_elements(
            By.XPATH,
            '//h2/a'
        )

        links_to_orders = [item.get_attribute('href') for item in links_to_orders_selenium]

        return links_to_orders


    def get_available_links(self):

        """ Забираем имеющиеся ссылки на заказы """

        done_links = []

        database = db.DataBase()
        list_links = database.get_existing_records()

        for element in list_links:

            link = element['link']
            done_links.append(link)

        return done_links


    def get_new_links_to_orders(self, links_to_orders, list_old_links_orders):

        """ Получаем новые ссылки на заказы """

        new_links_to_orders = []

        for link in links_to_orders:

            if not link in list_old_links_orders:

                new_links_to_orders.append(link)

        if new_links_to_orders:

            return ['Новый заказ', new_links_to_orders]

        else:

            return ['Новых заказов нет', new_links_to_orders]


    def add_new_order_links(self, links):

        """ Добавляем ссылки новых заказов в базу """

        database = db.DataBase()

        for link in links:

            database.add_new_entry(link)


    def start_parsing(self):

        """ Начать парсинг """

        browser = self.get_configured_browser()
        browser.get(self.link)

        self.specify_filters(browser)                          # Устанавливаем фильтры

        links_to_orders = self.get_links_to_orders(browser)    # Забираем ссылки на товары
        list_old_links_orders = self.get_available_links()     # Получаем имеющиеся ссылки на заказы

        new_links_to_orders = self.get_new_links_to_orders(links_to_orders, list_old_links_orders)  # Получаем новые ссылки на заказы

        if new_links_to_orders[0] == 'Новых заказов нет':  # Если новых заказов нет

            return ['Новых заказов нет', browser]

        elif new_links_to_orders[0] == 'Новый заказ':      # Если новые заказы есть

            self.add_new_order_links(new_links_to_orders[1])

            return [f'Новые заказы: {len(new_links_to_orders[1])}', new_links_to_orders[1], browser]
